home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1984-11-11 | 10.9 KB | 282 lines |
- 10 KEY OFF: CLS: SCREEN 0,0,0: WIDTH 80
- 20 TWOPI = 2*3.14159
- 30 DIM RX(128),RY(128),G(128),USX(360),USY(360),XX(360),XY(360)
- 40 DIM GX(360),GY(360),GAIN(360),RXNORM(128),RYNORM(128)
- 50 LOCATE 3,15:PRINT " *************************************************"
- 60 LOCATE 4,15:PRINT " * EVALUATION OF THE GAIN *"
- 70 LOCATE 5,15:PRINT " * OF *"
- 80 LOCATE 6,15:PRINT " * DISCRETE SENSOR ARRAYS *"
- 90 LOCATE 7,15:PRINT " * *"
- 100 LOCATE 8,15:PRINT " * written: 3/27/83 last revision: 10/10/84 *"
- 110 LOCATE 9,15:PRINT " * by: Donald L. Snyder *
- 120 LOCATE 10,15:PRINT " * Department of Electrical Engineering *"
- 130 LOCATE 11,15:PRINT " * Washington University *"
- 140 LOCATE 12,15:PRINT " * St. Louis, Missouri 63130 *"
- 150 LOCATE 13,15:PRINT " * *"
- 160 LOCATE 14,15:PRINT " * This program can be used to evaluate and *"
- 170 LOCATE 15,15:PRINT " * display the gain of up to 128 sensors in a *"
- 180 LOCATE 16,15:PRINT " * linear, circular, or user-defined planar *"
- 190 LOCATE 17,15:PRINT " * array. *"
- 200 LOCATE 18,15:PRINT " * *"
- 210 LOCATE 19,15:PRINT " *************************************************"
- 220 LOCATE 20,15:PRINT " * STRIKE ANY KEY WHEN READY *"
- 230 LOCATE 21,15:PRINT " *************************************************"
- 240 IF INKEY$ = "" THEN 240
- 250 CLS
- 260 LOCATE 8,20:PRINT "Options:"
- 270 LOCATE 10,20:PRINT " 1. read program description"
- 280 LOCATE 11,20:PRINT " 2. continue"
- 290 LOCATE 13,20:INPUT "Which option do you want";ANSWER
- 300 IF ANSWER=1 OR ANSWER=2 THEN GOTO 320
- 310 COLOR 14:LOCATE 15,17:PRINT "You must select 1 or 2. Select again.":COLOR 7:GOTO 290
- 320 IF ANSWER=1 THEN GOSUB 2670
- 330 GOSUB 1310: REM to setup sine/cosine table for source angles
- 340 REM *****************************************************************
- 350 REM **** begin main program
- 360 GOSUB 430: REM to input selection
- 370 GOSUB 1190: REM to scale sensor locations by two*pi
- 380 GOSUB 1250: REM to input look angle
- 390 GOSUB 1380: REM to evaluate x(n), n=1,2,...,N
- 400 GOSUB 1450: REM to evaluate array gain
- 410 GOSUB 1630: REM to display subroutine
- 420 REM *****************************************************************
- 430 REM **** begin input selection subroutine
- 440 CLS: LOCATE 10,1
- 450 PRINT "The gain of the following arrays can be evaluated."
- 460 PRINT
- 470 PRINT " 1. a linear array along vertical axis"
- 480 PRINT " 2. a circular array"
- 490 PRINT " 3. a user defined array"
- 500 PRINT: INPUT "Which array do you want evaluated"; ANSWER
- 510 IF ANSWER=1 OR ANSWER =2 OR ANSWER=3 THEN GOTO 530
- 520 COLOR 14:PRINT "You must select 1, 2, or 3. Select again.": COLOR 7:GOTO 500
- 530 ON ANSWER GOSUB 730,850,980
- 540 CLS:LOCATE 10,1
- 550 INPUT "Do you want uniform shading (answer Y or N)";ANS$
- 560 IF ANS$ = "N" OR ANS$ = "n" OR ANS$ = "NO" OR ANS$ = "No" OR ANS$ = "no" THEN GOTO 610
- 570 FOR I = 1 TO N
- 580 G(I) = 1/N
- 590 NEXT I
- 600 RETURN: REM to main program
- 610 FOR I = 1 TO N
- 620 PRINT
- 630 PRINT "What is the gain for array element " I "?":INPUT G(I)
- 640 NEXT I
- 650 SUM=0
- 660 FOR I = 1 TO N
- 670 SUM = SUM + G(I)
- 680 NEXT I
- 690 FOR I = 1 TO N
- 700 G(I) = G(I)/SUM
- 710 NEXT I
- 720 RETURN: REM to main program
- 730 REM **** input for a linear array
- 740 CLS:LOCATE 10,1
- 750 PRINT "You have selected a linear array. You must now specify the number"
- 760 PRINT "of array elements and the length of the array in wavelengths."
- 770 GOSUB 1110
- 780 PRINT:PRINT:INPUT "What is the length of the array in wavelengths";L
- 790 IF N=1 THEN D=0 ELSE D=L/(N-1)
- 800 FOR I = 1 TO N
- 810 RX(I) = 0
- 820 RY(I) = (I-1)*D
- 830 NEXT I
- 840 RETURN
- 850 REM **** input for a circular array
- 860 CLS:LOCATE 10,1
- 870 PRINT "You have selected a circular array. You must now specify the number"
- 880 PRINT "of array elements and the radius of the array in wavelengths."
- 890 GOSUB 1110
- 900 PRINT:PRINT:INPUT "What is the radius of the array in wavelengths";RAD
- 910 D = TWOPI/N
- 920 FOR I = 1 TO N
- 930 THETA = D*(I-1)
- 940 RX(I) = RAD*COS(THETA)
- 950 RY(I) = RAD*SIN(THETA)
- 960 NEXT I
- 970 RETURN
- 980 REM **** input for a user selected array
- 990 CLS:LOCATE 10,1
- 1000 PRINT " You are to specify the array. You must first specify the number"
- 1010 PRINT "of array elements and then their location."
- 1020 GOSUB 1110
- 1030 PRINT
- 1040 FOR I = 1 TO N
- 1050 CLS
- 1060 LOCATE 15,25:PRINT "For sensor " I
- 1070 LOCATE 16,25:INPUT "What is the x-location "; RX(I)
- 1080 LOCATE 17,25:INPUT "What is the y-location "; RY(I)
- 1090 NEXT I
- 1100 RETURN
- 1110 REM **** begin select number of array elements subroutine
- 1120 PRINT:PRINT "The number of elements must be an integer between or equal to 1 and 128."
- 1130 INPUT "What number of array elements do you want"; N
- 1140 FOR NTEST=1 TO 128
- 1150 IF NTEST=N GOTO 1180
- 1160 NEXT NTEST
- 1170 COLOR 14:PRINT:PRINT "The number must be an integer satisfying 1 =< N =< 128. Select again.":COLOR 7: GOTO 1130
- 1180 RETURN
- 1190 REM **** begin scale sensor locations by two*pi subroutine
- 1200 FOR I = 1 TO N
- 1210 RX(I) = RX(I)*TWOPI
- 1220 RY(I) = RY(I)*TWOPI
- 1230 NEXT I
- 1240 RETURN: REM to main program
- 1250 REM **** begin input look angle subroutine
- 1260 CLS:LOCATE 10,1
- 1270 INPUT "What look angle do you want (in degrees)";PHI
- 1280 PHIRAD = PHI*TWOPI/360: REM convert to radians
- 1290 ULX = COS(PHIRAD): ULY = SIN(PHIRAD)
- 1300 RETURN: REM to main program
- 1310 REM: **** begin source angle table subroutine
- 1320 LOCATE 15,1:PRINT:PRINT:COLOR 14:PRINT " ********** WAIT WHILE SETTING UP SOURCE ANGLE TABLE **********":COLOR 7
- 1330 FOR I = 1 TO 360
- 1340 THETA = (I-1)*TWOPI/360
- 1350 USX(I) = COS(THETA): USY(I) = SIN(THETA)
- 1360 NEXT I
- 1370 RETURN: REM to main program
- 1380 REM **** begin evaluate x(n) subroutine
- 1390 FOR I = 1 TO 360
- 1400 XX(I) = (ULX - USX(I))
- 1410 XY(I) = (ULY - USY(I))
- 1420 NEXT I
- 1430 PRINT XX(0) " " XY(0)
- 1440 RETURN: REM to main program
- 1450 REM **** begin evaluation of array gain
- 1460 CLS:LOCATE 10,10:COLOR 14:PRINT " ********** WAIT WHILE EVALUATING GAIN **********":COLOR 7
- 1470 FOR I = 1 TO 360
- 1480 GX(I) = 0: GY(I) = 0
- 1490 NEXT I
- 1500 FOR I = 1 TO 360
- 1510 FOR J = 1 TO N
- 1520 THETA = XX(I)*RX(J) + XY(I)*RY(J)
- 1530 GX(I) = GX(I) + G(J)*SIN(THETA)
- 1540 GY(I) = GY(I) + G(J)*COS(THETA)
- 1550 NEXT J
- 1560 GAIN(I) = SQR(GX(I)*GX(I)+GY(I)*GY(I))
- 1570 NEXT I
- 1580 FOR I = 1 TO 360
- 1590 GX(I) = GAIN(I)*USX(I)
- 1600 GY(I) = GAIN(I)*USY(I)
- 1610 NEXT I
- 1620 RETURN: REM to main program
- 1630 REM **** begin display subroutine
- 1640 CLS:LOCATE 10,1
- 1650 BEEP:BEEP
- 1660 PRINT "You can do the following."
- 1670 PRINT
- 1680 PRINT " 1. display the array"
- 1690 PRINT " 2. display the array gain"
- 1700 PRINT " 3. select another look angle and reevaluate the array gain"
- 1710 PRINT " 4. evaluate another array"
- 1720 PRINT " 5. list x-coordinate, y-coordinate, and gain of each sensor"
- 1730 PRINT " 6. list array gain as a function of source angle"
- 1740 PRINT " 7. quit"
- 1750 PRINT:INPUT "Select your option (1, 2, 3, 4, 5, 6, or 7)", ANSWER
- 1760 FOR I=1 TO 7
- 1770 IF I = ANSWER THEN GOTO 1800
- 1780 NEXT I
- 1790 COLOR 14:PRINT:PRINT "You must select 1 to 7. Select again.":COLOR 7: GOTO 1750
- 1800 ON ANSWER GOSUB 1820,2240,2640,2650,2450,2550,2890
- 1810 GOTO 1640
- 1820 REM **** begin display array subroutine
- 1830 CLS:SCREEN 2
- 1840 LOCATE 1,15:PRINT "SENSOR ARRAY GEOMETRY. STRIKE ANY KEY TO CONTINUE."
- 1850 DELX = 40: DELY = 16.8
- 1860 FOR I = 1 TO 11
- 1870 X1 = 120 + (I-1)*DELX: Y1 = 16
- 1880 X2 = X1: Y2 = 184
- 1890 LINE (X1,Y1)-(X2,Y2)
- 1900 NEXT I
- 1910 FOR I = 1 TO 11
- 1920 X1 = 120: Y1 = 16 + (I-1)*DELY
- 1930 X2 = 520: Y2 = Y1
- 1940 LINE (X1,Y1)-(X2,Y2)
- 1950 NEXT I
- 1960 LINE (110,100)-(530,100): LINE (320,10)-(320,190)
- 1970 LOCATE 2,42:PRINT "1.0"
- 1980 LOCATE 14,67:PRINT "1.0":LOCATE 14,11:PRINT "-1.0"
- 1990 REM scale by distance to most distant sensor
- 2000 RMAXSQ = 0
- 2010 FOR I = 1 TO N
- 2020 RSQ = RX(I)*RX(I) + RY(I)*RY(I)
- 2030 IF RSQ > RMAXSQ THEN RMAXSQ = RSQ
- 2040 NEXT I
- 2050 RMAX = SQR(RMAXSQ)
- 2060 IF RMAX = 0 THEN GOTO 2170
- 2070 FOR I = 1 TO N
- 2080 RXNORM(I) = RX(I)/RMAX: RYNORM(I) = RY(I)/RMAX
- 2090 NEXT I
- 2100 LOCATE 8,70:PRINT "SCALE"
- 2110 LOCATE 9,70:PRINT "FACTOR"
- 2120 LOCATE 10,70:PRINT USING "##.##^^^^";RMAX/TWOPI
- 2130 LOCATE 17,70:PRINT "LOOK"
- 2140 LOCATE 18,70:PRINT "ANGLE"
- 2150 LOCATE 19,70:PRINT USING "###.##";PHI
- 2160 LOCATE 20,70:PRINT "DEGREES"
- 2170 FOR I = 1 TO N
- 2180 X = 320 + 200*RXNORM(I): Y = 100 - 83*RYNORM(I)
- 2190 CIRCLE (X,Y),5
- 2200 NEXT I
- 2210 IF INKEY$ = "" GOTO 2210
- 2220 CLS:SCREEN 0
- 2230 RETURN
- 2240 REM **** begin display array gain subroutine
- 2250 CLS:SCREEN 2
- 2260 LINE (90,100)-(550,100):LINE (320,10)-(320,190)
- 2270 LOCATE 1,17:PRINT "POLAR PLOT OF ARRAY GAIN. STRIKE ANY KEY TO CONTINUE."
- 2280 FOR I = 1 TO 5
- 2290 RAD = 40*I
- 2300 CIRCLE (320,100),RAD
- 2310 NEXT I
- 2320 LOCATE 14,67:PRINT "1.0"
- 2330 FOR I = 1 TO 360
- 2340 X = 320 + 200*GX(I)
- 2350 Y = 100 - 83*GY(I)
- 2360 PSET (X,Y),1
- 2370 NEXT I
- 2380 LOCATE 17,70:PRINT "LOOK"
- 2390 LOCATE 18,70:PRINT "ANGLE"
- 2400 LOCATE 19,70:PRINT USING "###.##";PHI
- 2410 LOCATE 20,70:PRINT "DEGREES"
- 2420 IF INKEY$ = "" GOTO 2420
- 2430 CLS:SCREEN 0
- 2440 RETURN
- 2450 REM **** begin list array parameters subroutine
- 2460 CLS: LOCATE 1,18:PRINT "LIST X-COORDINATE, Y-COORDINATE, AND GAIN OF EACH SENSOR"
- 2470 LOCATE 2,32: PRINT "PRESS ANY KEY WHEN READY."
- 2480 IF INKEY$ = "" GOTO 2480
- 2490 FOR I = 1 TO N
- 2500 PRINT I,"x= " RX(I)/TWOPI, "y= " RY(I)/TWOPI, "gain= " G(I)
- 2510 NEXT I
- 2520 PRINT: PRINT "PRESS ANY KEY TO CONTINUE."
- 2530 IF INKEY$ = "" GOTO 2530
- 2540 RETURN
- 2550 REM **** begin list array gain versus angle subroutine
- 2560 CLS:LOCATE 1,10:PRINT "ARRAY GAIN VERSUS ANGLE IN DEGREES. PRESS ANY KEY WHEN READY."
- 2570 IF INKEY$ = "" GOTO 2570
- 2580 FOR I = 1 TO 360
- 2590 PRINT "angle= " I-1, "gain=" GAIN(I)
- 2600 NEXT I
- 2610 PRINT:PRINT "press any key to continue."
- 2620 IF INKEY$ = "" GOTO 2620
- 2630 RETURN
- 2640 GOTO 380
- 2650 GOTO 360
- 2670 CLS
- 2680 LOCATE 1,25:COLOR 14:PRINT "--- PROGRAM DESCRIPTION ---":COLOR 7
- 2690 PRINT:PRINT
- 2700 PRINT " The purpose of this program is to evaluate the gain of a"
- 2710 PRINT "planar array of omnidirectional sensors. N sensors at locations"
- 2720 PRINT "r1, r2, ..., rN are assumed, where 1 <= N <= 128. Larger values of N"
- 2730 PRINT "can be accommodated by a straightforward modification of the"
- 2740 PRINT "program. The sensor at rn can be assigned a 'shading gain' gn."
- 2750 PRINT "The 'look angle' of the array is the direction for which its"
- 2760 PRINT "phasing yields the greatest sensitivity or gain. The gain"
- 2770 PRINT "computed is:"
- 2780 PRINT
- 2790 PRINT " G(theta) = |sum[gn exp(-jxn)|,"
- 2800 PRINT
- 2810 PRINT "where xn = 2(pi)<ul-u,rn>, ul is a unit vector in the look"
- 2820 PRINT "direction, theta Y.BAS 2176 A 05/17/84 08:47<UNK! {000D}><UNK! {000A}>MUSIC .DOC 1664 A 09/20/83 20:37 DDATE .COM 512 A 05/13/84 16:05<UNK! {000D}><UNK! {000A}>HOPPER .BAS 4995 A 04/24/84 22:07 DOSEDIT .COM 2432 A 05/17/84 08:49<UNK! {000D}><UNK! {000A}>GUITAR .BAS 1152 A 04/24/84 22:16 U-FORMAT.EXE 38656 A 06/08/84 13:38<UNK! {000D}><UNK! {000A}>123RANGE.BAS 6962 A 04/24/84 22:22 GROWTH .TXT 2304 A 05/14/84 07:20<UNK! {000D}><UNK! {000A}>MUSIC .BAS 14399 A 04/
-